/**
 * 
 */
package neptune.web.client.services;

import neptune.web.client.model.cluster.SerializableCluster;
import neptune.web.client.model.cluster.SerializablePhysicalNode;

import com.google.gwt.user.client.rpc.AsyncCallback;

/**
 * @author Roberto Bifulco [RobertoBifulco.it] [info@robertoBifulco.it]
 * 
 */
public interface ClusterServiceAsync {

	/**
	 * Aggiunge una macchina fisica al cluster
	 * 
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void addPhysicalMachine(
			SerializablePhysicalNode serializablePhysicalNode, AsyncCallback<Boolean> callback);

	/**
	 * Modifica i parametri di una macchina fisica
	 * 
	 * @param serializablePhysicalNode
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void editPhysicalMachine(
			SerializablePhysicalNode serializablePhysicalNode, AsyncCallback<Boolean> callback);

	/**
	 * Gets the actual cluster configuration
	 * 
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getCluster(AsyncCallback<SerializableCluster> callback);

	/**
	 * Restituisce il descrittore di una macchina fisica del Cluster
	 * 
	 * @param idPhysicalNode
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getPhysicalNode(String idPhysicalNode, AsyncCallback<SerializablePhysicalNode> callback);

	/**
	 * Restituisce un array con le informazioni sulla PM il cui identificativo �
	 * passato come argomento. L'array e' cosi' strutturato:<br>
	 * <br>
	 * [0] = % utilizzo cpu;<br>
	 * [1] = quantita' di memoria ram adoperata; <br>
	 * [2] = quantita' hd occupato
	 * 
	 * @param pmId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getPMState(String pmId, AsyncCallback<String[]> callback);

	/**
	 * Restituisce un array di stringhe contenente le informazioni sui task in
	 * esecuzione sul cluster. L'array &egrave; strutturato nel seguente modo:<br>
	 * per ogni i-esima entry: <br>
	 * [i][0] = Descrizione<br>
	 * [i][1] = stato<br>
	 * 
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getTask(AsyncCallback<String[][]> callback);

	/**
	 * Restituisce un array di array di stringhe, contenente le informazioni
	 * sulle vm ospitate da una pm. L'array � strutturato nel seguente modo: <br>
	 * <br>
	 * per ogni i-esima entry: <br>
	 * [i][0] = vm Id<br>
	 * [i][1] = vm status<br>
	 * [i][2] = vm controll address<br>
	 * 
	 * @param pmId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getVMsHostedByPM(String pmId, AsyncCallback<String[][]> callback);

	/**
	 * Restituisce dati statistici sull'hypervisro presente sulla macchina
	 * indicata da idPhysicalMachine
	 * 
	 * @param idPhysicalMachine
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getXenStatistic(String idPhysicalMachine, AsyncCallback<String[][]> callback);

	/**
	 * Mette in pausa il nodo il cui identificativo globale e' passato come
	 * argomento.
	 * 
	 * @param nodeId
	 * @return nodeState
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void pauseNode(String nodeId, AsyncCallback<String> callback);

	/**
	 * Mette in pausa il nodo il cui identificativo globale e' passato come
	 * argomento, che risiede sulla data pm.
	 * 
	 * @param nodeId
	 * @return nodeState
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void pauseNode(String nodeId, String pmId, AsyncCallback<String> callback);

	/**
	 * Riavvia il nodo il cui identificativo globale e' passato come argomento.
	 * 
	 * @param nodeId
	 * @return nodeState
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void rebootNode(String nodeId, AsyncCallback<String> callback);

	/**
	 * Riavvia il nodo il cui identificativo globale e' passato come argomento ,
	 * che risiede sulla data pm.
	 * 
	 * @param nodeId
	 * @return nodeState
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void rebootNode(String nodeId, String pmId, AsyncCallback<String> callback);

	/**
	 * Elimina dalla coda dei Jobs tutti quelli terminati
	 * 
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void removeAllFinishedJobs(AsyncCallback<Boolean> callback);

	/**
	 * Elimina una physical machine dal cluster
	 * 
	 * @param idPhysicalMachine
	 * @throws Exception
	 * @throws SecurityException
	 */
	public void removePhysicalMachine(String idPhysicalMachine, AsyncCallback<String> callback);

	/**
	 * Avvia il nodo il cui identificativo globale e' passato come argomento.
	 * 
	 * @param nodeId
	 * @return nodeState
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void startNode(String nodeId, AsyncCallback<String> callback);

	/**
	 * Avvia il nodo, il cui identificativo globale e' passato come argomento,
	 * che risiede sulla data pm.
	 * 
	 * @param nodeId
	 * @return nodeState
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void startNode(String nodeId, String pmId, AsyncCallback<String> callback);

	public void saveNodeAsTemplate(String nodeId, String templateName, AsyncCallback<String> callback);
}
